<template>
  <div class="logincom">
    <div class="content">
        <h2>商城App后台管理系统</h2>
        <!-- 引用element表单 -->
        <el-form :model="loginObj" :rules="loginRules" ref="ruleformRef">
            <el-form-item label="UserName" class="item__label" prop="uname">
                <el-input placeholder="请输入邮箱/手机号码登录" class="item_input" v-model.lazy.trim="loginObj.uname"/>
            </el-form-item>
            <el-form-item label="PassWord" class="item__label" prop="upwd">
                <el-input placeholder="请输入登录密码" show-password class="item_input" v-model.lazy.trim="loginObj.upwd"/>
            </el-form-item>
            <el-form-item prop="isAgreen">
                <el-checkbox v-model="loginObj.isAgreen">已阅读并同意《服务条款》</el-checkbox>
            </el-form-item>
            <el-form-item>
                <el-button type="primary" color="darkcyan" class="txtcol" @click="onLogin(ruleformRef)">登录</el-button>
            </el-form-item>
        </el-form>
    </div>
  </div>
</template>

<script setup>

// import list from '../../assets/list';

import { ElMessage } from "element-plus";
// import { useRoute, useRouter } from 'vue-router';
import { inject, reactive, ref } from "vue";
import { md5 } from 'js-md5';
import router from "@/router";
//订阅￥axios
const $axios = inject('$axios');
//组件创建完成后，自动捕获表单的DOM对象
const ruleformRef = ref('');
//表单数据绑定对象
let loginObj = reactive({
    uname : '',
    upwd : '',
    isAgreen : false,
})
// const route = useRoute();
// const router = useRouter();


//
const RuleAgreen = ( rule,value,callback )=>{
    //如果没有勾选复选框则报错，勾选了复选框则继续登录
    if( !value ){
        callback( new Error('必须勾选该项！') );
    }else{
        callback();
    }
}

//验证规则对象
const loginRules = reactive({
    //针对第一个账号输入框进行失去焦点时，非空验证
    uname : [
        { required:true , message:'必须填写登录账号！',trigger:'blur' }
    ],
    upwd : [
        { required:true , message:'必须填写登录密码',trigger:'blur' }
    ],
    isAgreen : [
        //自定义验证规则，那么必须保证自定义验证函数在规则对象之前创建
        { validator:RuleAgreen , trigger:'change' }
    ]
})

//提交表单
const onLogin = (formEl)=>{
    //提取rules的验证规则结果
    // 此写适用于非setup结构 / vue2写法 this.$refs[formEl].validate((val)=>{
    formEl.validate((val)=>{
        if(val){
           let data = {
            username : loginObj.uname,
            password : md5( loginObj.upwd )
           }
           //向登录接口
           $axios.post('/login' , data).then( (res)=>{
            if( res.code === '200' ){
                router.push('/admin/index');
                sessionStorage.setItem('user' , JSON.stringify(res.data))
            }else{
                ElMessage.error(res.msg);
            }
            
           } ).catch( (error)=>{
            console.log(error);
            
            if( error.response == undefined || error.response.data == undefined ){
                ElMessage.error(error);

            }else{
                ElMessage.error(error.response.data);
            }
           } )
    }else{
            
            ElMessage.error('登录失败，请重新登录')
            return false;
        }
    })
}
</script>

<style scoped>
.logincom{
    width: 100%;
    height: 100vh;
    overflow: hidden;
    background-color: #2a2a33;
    position: relative;
}
.logincom .content{
    width: 400px;
    background-color: rgba(255, 255, 255, 0.8);
    box-shadow: 0px 0px 8px white;
    border-radius: 10px;
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%,-50%);
}
.logincom .content h2{
    color: #008b8b;
    line-height: 80px;
    text-align: center;
    font-size: 24px;
    font-family: "黑体";
}
/* 当使用第三方UI框架时需要修改样式的情况，观察浏览器的最终组件效果：*/
/* 情况1：结构比较简单，组件直接生成对应的标签，如el-form直接生成from标签的情况，可以直接针对标签进行样式修改 */
.logincom .content form{
    width: 90%;
    margin: 0 auto;
}
.logincom .content button{
    width: 100%;
}
/* :deep(): 穿刺（存在兼容性问题，移动端不显示） */
.logincom .content :deep(button>span){
    color: white;
}
/* 情况1：结构比较复杂，组件生成多层结构，如el-form-item生成div+label结构情况，采用自定义class选择器设置到组件上的操作 */
.logincom .content .item__label{
    font-weight: 600;
}
.logincom .content .item_input{
    border: 1px solid gray;
    border-radius: 6px;
    line-height: 40px;
    overflow: hidden;
}
</style>